import fs from 'fs';
import path from 'path';
import { logInfo, logWarn, logError } from '../logger.js';

class StatisticsService {
  /**
   * 获取指定平台在时间段内的退款数据
   * @param {string} platform - 平台名称
   * @param {string} startTime - 开始时间
   * @param {string} endTime - 结束时间
   * @returns {Array} 符合条件的退款数据
   */
  getPlatformData(platform, startTime, endTime) {
    logInfo(`[getPlatformData] 读取平台: ${platform}, 时间段: ${startTime} - ${endTime}`);
    let filePath = '';

    switch (platform) {
      case 'douyin':
        filePath = path.join('src', 'platforms', 'douyin', 'douyin.json');
        break;
      case 'tmall':
        filePath = path.join('src', 'platforms', 'tmall', 'tmall.json');
        break;
      case 'pinduoduo':
        filePath = path.join('src', 'platforms', 'pinduoduo', 'pinduoduo.json');
        break;
      case 'taobao':
        filePath = path.join('src', 'platforms', 'taobao', 'taobao.json');
        break;
      case 'weixin':
        filePath = path.join('src', 'platforms', 'weixin', 'weixin.json');
        break;
      default:
        logError(`[getPlatformData] 不支持的平台: ${platform}`);
        throw new Error(`不支持的平台: ${platform}`);
    }

    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      logWarn(`[getPlatformData] 文件不存在: ${filePath}`);
      // 如果文件不存在，返回空数组而不是抛出错误
      return [];
    }

    // 读取并解析JSON文件
    const fileContent = fs.readFileSync(filePath, 'utf-8');
    const data = JSON.parse(fileContent);

    // 解析时间
    const start = new Date(startTime);
    const end = new Date(endTime);

    // 过滤指定时间范围内的数据
    const filtered = data.filter(item => {
      if (!item['售后时间']) return false;

      const itemTime = new Date(item['售后时间']);
      return itemTime >= start && itemTime <= end;
    });

    logInfo(`[getPlatformData] 过滤后数据: ${filtered.length} 条`);
    return filtered;
  }

  /**
   * 保存单个账户退款成功数据到 json 文件
   * @param {string} accountKey - 账户 key（如 tmall_fdt）
   * @param {Array|Object} data - 退款成功数据
   */
  saveRefundRecord(accountKey, data) {
    logInfo(`[saveRefundRecord] 保存 ${accountKey} 退款数据`);
    const filePath = path.join('refund-records', `${accountKey}.json`);
    let records = [];
    if (fs.existsSync(filePath)) {
      try {
        records = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
      } catch (e) {
        records = [];
      }
    }
    if (Array.isArray(data)) {
      records = records.concat(data);
    } else {
      records.push(data);
    }
    fs.writeFileSync(filePath, JSON.stringify(records, null, 2), 'utf-8');
    logInfo(`[saveRefundRecord] 已保存 ${accountKey} 退款数据，共 ${records.length} 条`);
  }

  /**
   * 统计指定账户在时间段内的退款数据
   * @param {string} accountKey - 账户 key（如 tmall_fdt）
   * @param {string} startTime - 开始时间
   * @param {string} endTime - 结束时间
   * @returns {Array} 退款数据
   */
  getAccountRefundStatistics(accountKey, startTime, endTime) {
    const filePath = path.join('refund-records', `${accountKey}.json`);
    if (!fs.existsSync(filePath)) return [];
    let data = [];
    try {
      data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
    } catch (e) {
      logError(`[getAccountRefundStatistics] 解析失败: ${filePath}`);
      return [];
    }
    const start = new Date(startTime);
    const end = new Date(endTime);
    return data.filter(item => {
      if (!item['售后时间']) return false;
      const itemTime = new Date(item['售后时间']);
      return itemTime >= start && itemTime <= end;
    });
  }

  /**
   * 批量统计所有账户退款数据
   * @param {Array} accountKeys - 账户 key 列表
   * @param {string} startTime
   * @param {string} endTime
   * @returns {Object} 统计结果
   */
  async getRefundStatistics(accountKeys, startTime, endTime) {
    logInfo(`[getRefundStatistics] 统计账户: ${JSON.stringify(accountKeys)}, 时间段: ${startTime} - ${endTime}`);
    const result = {};
    for (const key of accountKeys) {
      const data = this.getAccountRefundStatistics(key, startTime, endTime);
      result[key] = {
        account: key,
        count: data.length,
        details: data
      };
      logInfo(`[getRefundStatistics] ${key} 数据: ${data.length} 条`);
    }
    return result;
  }

  /**
   * 格式化统计结果为可读格式
   * @param {Object} statistics - 统计结果
   * @returns {string} 格式化后的统计结果
   */
  formatStatistics(statistics) {
    let output = '\n=== 自动退款订单统计 ===\n';
    let total = 0;

    for (const [key, data] of Object.entries(statistics)) {
      output += `\n${data.platform || data.account}:\n`;
      output += `  处理数量: ${data.count}\n`;

      if (data.error) {
        output += `  错误信息: ${data.error}\n`;
        logWarn(`[formatStatistics] ${data.platform || data.account} 错误: ${data.error}`);
      }

      total += data.count;
    }

    output += `\n总计: ${total} 笔退款订单\n`;
    logInfo(`[formatStatistics] 总计: ${total} 笔退款订单`);
    return output;
  }
}

export default new StatisticsService();